文章目录
  1. 1. 编写第一个script
  2. 2. 实现范例1
  3. 3. 实现范例2
  4. 4. script执行方式的区别
  5. 5. shell中的判断式
    1. 5.1. 测试功能 test
    2. 5.2. 判断符号[]
    3. 5.3. shell script中的默认变量
  6. 6. 条件判断式
    1. 6.1. if…then
    2. 6.2. case…esca
    3. 6.3. 函数function
  7. 7. 循环
    1. 7.1. while do done,until do done(不定循环)
    2. 7.2. for…do…done(固定循环)
    3. 7.3. for…do…done的数值处理
  8. 8. shell script的追踪调试

Shell SCript是一种纯文本文件,帮助我们一次执行多个命令,或者是利用一些逻辑判断帮助我们实现某些功能。(本文适合初学者)

编写第一个script

1
2
3
4
5
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
echo -e "Hello World! \a\n"
exit 0

说明:

  1. 第一行#!/bin/bash声明script使用的shell名称
  2. 整个script除了第一行的#!用来声明shell的之外,其他都是注释作用
  3. 务必将一些重要的环境变量设置好,这样可以使我们的程序在进行时可以直接执行外部的一些命令,而不必写绝对路径

    实现范例1

读取姓、名然后出输出

1
2
3
4
5
6
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
read -p "Please input your first name: " firstname
read -p "Please input your last name: " lastname
echo -e "\nYour name is:" $firstname $lastname

实现范例2

1
2
3
4
5
6
7
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
read -p "first num: " firstnum
read -p "second num: " secondnum
total=$(($firstnum*$secondnum))
echo -e "\nThe result is $total"

script执行方式的区别

  1. 使用sh或者 . 来执行script时,该script都会使用一个新的bash环境来执行脚本中的命令。就是说使用这种方式执行时,script是在子进程中执行的,所以子进程的各项变量和操作不会传回到父进程中。例如在子进程中有两个变量a b,使用这种方式执行script之后,echo $a $b 是没有值的。
  2. 使用source来执行script时,不会开启新的进程来执行,只会在该进程执行,所以echo $a $b 是可以获取到值的。

    shell中的判断式

    测试功能 test

    利用test -e 来判断某一个文件是否存在
    1
    test -e /filename && echo "exit" || echo "Not exit"

test常用指令:

1
2
3
test -e 该文件名是否存在
test -f 该文件名是否存在且为文件
test -d 该文件名是否存在且为目录

举例:判断一个文件是否存在,给出提示信息,不存在就中断程序,如果存在判断是文件还是目录,并判断执行者对它拥有的权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim testfile.sh
#!/bin/bash
read -p "Input a filename: " filename
test -z $filename && echo "You must input a filename" && exit 0 #判断输入的是否是字符串
test ! -e $filename && echo "The filename '$filename' do not exit" && exit 0 #判断文件是否存在
echo -e "\nThe result is $total"
#判断文件的类型和属性
test -f $filename && filetype="file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo -e "\nThe filename: $file is a $filetype"
echo -e "\nThe filename: $file permissions are: $perm"

判断符号[]

[ “$HOME”==”$MAIL” ] 用来判断$HOME和$MAIL是否相同。
举例:当执行一个程序的时候,程序会让用户来选择输入Y继续执行还是输入N停止运行

1
2
3
4
5
6
7
8
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH

read -p "Please input (y/n): " yn
[ "$yn"=="Y" -o "$yn"=="y" ] && ehco "continue" && exit 0
[ "$yn"=="N" -o "$yn"=="n" ] && ehco "interrupt" && exit 0
echo -e "\nThe result is $total"

shell script中的默认变量

1
2
3
4
5
6
7
8
9
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH

echo "The script name is $0"
echo "The parameter number is $#"
echo "The Whole paratemeter is '$@'"
echo "The 1st paratemeter is $1"
echo "The 2nd paratemeter is $2"

执行上面脚本,要传递参数

1
sh test.sh aa bb

执行结果为:

1
2
3
4
5
The script name is test
The parameter number is 2
The Whole paratemeter is 'aa bb'
The 1st paratemeter is aa
The 2nd paratemeter is bb

条件判断式

if…then

基本格式:

1
2
3
4
5
6
7
if[ ... ];then
...
elif[ ... ];then
...
else
...
fi

举例:检测本机中80端口是否启动

1
2
3
4
5
6
testing=$(netstat -tuln | grep ":80") #netstat -tuln获取当前主机启动的服务
if[ "$testing" != "" ];then
echo "is running"
else
echo "is not running"
fi

case…esca

基本格式:

1
2
3
4
5
6
7
8
9
case $变量名称 in
"第一个变量内容")
程序段
;;
case $变量名称 in
"第二个变量内容")
程序段
;;
esca

举例:用户输入one、two其中一个,将用户的输入输出到屏幕当中,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH

case $s1 in
"one")
echo "You input is one"
;;
"two")
echo "You input is two"
;;
*)
echo "You input is other"
;;

通过 sh test.sh one 来执行上面的script。

函数function

和我们平时开发中使用到的方法类似,同样拥有内置变量,函数名称代表$0,后续的变量用$1、$2…表示。更改利用function实现之前的script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 #!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH

fuction printit(){
echo "You input is $1"
}
case $s1 in
"one")
printit one
;;
"two")
printit two
;;
*)
printit other
;;

循环

while do done,until do done(不定循环)

一般来说,不定循环的最常见状态就是下面两种方法:

1
2
3
4
while[ ... ]
do
...
done

1
2
3
4
until[ ... ]
do
...
done

举例:计算1+2+3+4+…+100的值

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH

s=0
i=0
while[ "$i"!="100" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "The result is : $s"

for…do…done(固定循环)

简单举例:

1
2
3
4
for animal in dog cat pig
do
echo "The animal is ${animal}"
done

举例:用户输入某文件名,然后找出改文件内的各个文件的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH

#先判断目录是否存在
read "Please input a directory: " dir
if[ "$dir"=="" -o ! -d "$dir" ];then
echo "The directory is not exist"
exit 1
fi
#开始测试文件
filelist=$(ls $dir)
for filename in $filelist
do
perm=""
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo -e "\nThe filename: $file permissions are: $perm"
done

for…do…done的数值处理

举例:

1
2
3
4
5
6
s=0
for ((i=1;i<=100;i++))
do
s=$(($s+$i))
done
echo "The result is : $s"

shell script的追踪调试

1
2
3
sh -n :不要执行script,仅查询语法问题,如果语法没有问题则不会显示任何信息
sh -v :在执行script之前,先将script的内容输出的屏幕上
sh -x :将使用到的script内容显示到屏幕上,很常用
文章目录
  1. 1. 编写第一个script
  2. 2. 实现范例1
  3. 3. 实现范例2
  4. 4. script执行方式的区别
  5. 5. shell中的判断式
    1. 5.1. 测试功能 test
    2. 5.2. 判断符号[]
    3. 5.3. shell script中的默认变量
  6. 6. 条件判断式
    1. 6.1. if…then
    2. 6.2. case…esca
    3. 6.3. 函数function
  7. 7. 循环
    1. 7.1. while do done,until do done(不定循环)
    2. 7.2. for…do…done(固定循环)
    3. 7.3. for…do…done的数值处理
  8. 8. shell script的追踪调试